package com.concurrent.chapter4.concurrent07;

import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;


public class Run4_1 {
	public static void main(String[] args) throws InterruptedException {
		Runnable runnable = new Runnable() {
			
			@Override
			public void run() {
				try {
					System.out.println(Thread.currentThread().getName() + " run!" + System.currentTimeMillis());
					Thread.sleep(1000);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		};
		int corePoolSize = 7;
		int maximumPoolSize = 8;
		int keepAliveTime = 5;
		TimeUnit unit = TimeUnit.SECONDS;
		/*
		 *队列使用LinkedBlockingDeque类并且线程数量>corePoolSize时，将其余的线程放入池中
		 *同一时间内只有corePoolSize个线程在运行
		 *所以keepAliveTime>5时不清除空闲线程
		 */
		LinkedBlockingDeque<Runnable> workQueue = new LinkedBlockingDeque<Runnable>();
		ThreadPoolExecutor executor = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue);
		executor.execute(runnable);//1
		executor.execute(runnable);//2
		executor.execute(runnable);//3
		executor.execute(runnable);//4
		executor.execute(runnable);//5
		executor.execute(runnable);//6
		executor.execute(runnable);//7
		executor.execute(runnable);//8
		executor.execute(runnable);//9
		Thread.sleep(300);
		System.out.println("A:" + executor.getCorePoolSize());//7
		System.out.println("A:" + executor.getPoolSize());//7
		System.out.println("A:" + executor.getQueue().size());//2
		Thread.sleep(10000);
		System.out.println("B:" + executor.getCorePoolSize());//7
		System.out.println("B:" + executor.getPoolSize());//7
		System.out.println("B:" + executor.getQueue().size());//0
	}
}
